package com.hedl.practice.diyJava.reflex.study_01.tmp02;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Client {
    public static void main(String[] args) {
        /*Student[] students = {new Ordinary("小明"),new District("大明")};

        for (Student student : students){
            student.eat();
            student.write("作文题目都一样");
            System.out.println(student);
        }*/

        District district = new District("皇小明");        //区长儿子 皇小明

        //这里为什么拿到的是 Behaviour 类型，因为接口不能实例化，Proxy.newProxyInstance 顾名思义是生成代理接口对象
        Behaviour districtProxy = (Behaviour) getProxy(district);

        districtProxy.eat();        //区长儿子吃饭饭
        districtProxy.write("爸爸的爸爸学代理");        //区长儿子写作文
        System.out.println(districtProxy);
    }

    public static Object getProxy(final Object target){
        Object proxy = Proxy.newProxyInstance(
                target.getClass().getClassLoader(),     //代理目标类的 class 的 class 生成器
                target.getClass().getSuperclass().getInterfaces(),      //代理类要实现的接口 本例中是 目标类的父类的接口;Student-->Behaviour
                new InvocationHandler() {
                    @Override       //// 中转反射器，代理类执行方法，到这里，中转反射到目标类上，如果感觉名字怪怪的那就对了，我自己瞎起的，不在意这些细节
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("孩子们"+method.getName()+"了...");

                        //System.out.println("--->"+method.getName());
                        Object result = method.invoke(target,args);
                        //System.out.println(">>>>>"+result);
                        System.out.println("孩子们"+method.getName()+"结束了...");
                        //System.out.println("====="+method.getName());
                        return result;
                    }
                }
        );
        return proxy;
    }
}
